package logica_de_presentacion;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import comun.Pelicula;
import logica_de_negocio.ExcepDatosNoAdmitidos;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.excepAnadirDupli;
import logica_de_negocio.gestorPeli;

public class FormularioAnadirModificarPelicula extends JInternalFrame implements
		ActionListener {

	/**
	 * FORMULARIO PARA ANADIR PELICULAS --------> Formulario de modificar
	 * peliculas
	 */
	private static final long serialVersionUID = 1L;
	private JButton salir, anadir;
	private JTextField titu, pais, dir, acto;
	protected JSpinner spiOscar;
	private JSpinner.DateEditor fecha;
	private int idOriPel;
	private boolean estadoModi;
	protected JSpinner spiDura;

	public FormularioAnadirModificarPelicula(boolean estadoModi,
			java.util.Date today, double dura, int actOscar) {
		// titulo, duracion, pais, director, actor principal, fecha estreno,
		// oscars,premio donosti
		super("Anadir/Modificar peliculas", true, true, true, true);
		// Nombre, resizable,closable,maximizable,inconifiable (minimizable)

		this.setVisible(true);
		this.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);// QUE
		this.estadoModi = estadoModi; // PASA?

		JPanel textos = new JPanel(new GridLayout(6, 2));// FILAS,Columnas
		JPanel Botones = new JPanel();
		this.setLayout(new FlowLayout());// TIPO DE ORDENACION

		// TEXTO
		titu = new JTextField("Titulo de la Pelicula", 20);
		textos.add(titu);

		// NUMERO DE DURACION
		spiDura = new JSpinner();// ACTUAL , MIN, MAX, SALTO
		spiDura.setModel(new SpinnerNumberModel(dura, 1, 999, 1));
		spiDura.setEditor(new JSpinner.NumberEditor(spiDura, "0"));
		JLabel jldura2 = new JLabel("Duracion: ");
		JLabel jlmin = new JLabel("minutos");
		JPanel jpdura2 = new JPanel();
		jpdura2.add(jldura2);
		jpdura2.add(spiDura);
		jpdura2.add(jlmin);
		textos.add(jpdura2);
		// PAIS
		pais = new JTextField("Pais de origen", 20);
		textos.add(pais);
		// DIRECION
		dir = new JTextField("Director", 20);
		textos.add(dir);
		// ACTOR
		acto = new JTextField("Actor principal", 20);
		textos.add(acto);

		// FECHA
		JSpinner s = new JSpinner(new SpinnerDateModel(today, null, null,
				Calendar.DAY_OF_WEEK_IN_MONTH));
		fecha = new JSpinner.DateEditor(s, "MM/d/yyyy");
		s.setEditor(fecha);
		JLabel fech = new JLabel("Fecha de estreno");
		JPanel jpfecha = new JPanel();
		jpfecha.add(fech);
		jpfecha.add(s);
		textos.add(jpfecha);

		// OSCARS
		spiOscar = new JSpinner();// ACTUAL , MIN, MAX, SALTO
		spiOscar.setModel(new SpinnerNumberModel(actOscar, 0, 99, 1));
		spiOscar.setEditor(new JSpinner.NumberEditor(spiOscar, "0"));
		JLabel oscar = new JLabel("Numero de Oscars");
		JPanel pOsca = new JPanel();
		pOsca.add(oscar);
		pOsca.add(spiOscar);
		textos.add(pOsca);

		this.getContentPane().add(textos, "North");

		// BOTONES
		ImageIcon tick = createImageIcon("/logica_de_presentacion/imagenes/TICK.gif");
		if (estadoModi) {
			anadir = new JButton("Modificar", tick);
			anadir.setToolTipText("Modificar la pelicula en la base de datos");
		} else {
			anadir = new JButton("Anadir", tick);
			anadir.setToolTipText("Anadir la pelicula en la base de datos");
		}

		anadir.setVerticalTextPosition(AbstractButton.CENTER);
		anadir.setHorizontalTextPosition(AbstractButton.LEADING); // aka LEFT,
																	// for
																	// left-to-right
																	// locales
		Botones.add(anadir);
		anadir.addActionListener(this);
		ImageIcon cancelar = createImageIcon("/logica_de_presentacion/imagenes/CANCELAR.gif");
		salir = new JButton("Cancelar", cancelar);
		salir.setVerticalTextPosition(AbstractButton.CENTER);
		salir.setHorizontalTextPosition(AbstractButton.LEADING); // aka LEFT,
																	// for
																	// left-to-right
																	// locales
		Botones.add(salir);
		salir.addActionListener(this);

		// ANADIMOS AL PANEL PRINCIPAL
		this.getContentPane().add(Botones, "South");

		// TAMANO JUSTO
		this.pack();

	}

	public void cargarMo(Pelicula p) {

		this.idOriPel = p.getId_p();
		titu.setText(p.getTitulo());
		pais.setText(p.getPais());
		dir.setText(p.getDirector());
		acto.setText(p.getActorPrincipal());

	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsa = (JButton) e.getSource();

		if (botonPulsa == salir) {

			int valor = JOptionPane.showConfirmDialog(this, "ESTA SEGURO ?");
			// YES=0, NO=1,Cancel =2
			if (valor == 0) {
				this.dispose();
			}
		} else {// MODIFICAR; o ANADIR

			if (botonPulsa == anadir) {
				gestorPeli gp = new gestorPeli();
				
				if (estadoModi) {
					Pelicula p;
					try {
						gp.cargarDatos();
						p = pelDese();
						p.setId_p(idOriPel);
						boolean mo = gp.modificarPeli(p);
						if (mo) {
							JOptionPane.showMessageDialog(new Frame(),
									"Pelicula modificado");
							this.dispose();
						}else{
							JOptionPane.showMessageDialog(new Frame(),
									"Pelicula _NO_ modificado");
						}

					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					} catch (FaltanDatosEnLaBaseDeDatos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getFalta());
					} catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				} else {
					// ANADIR
					try {
						gp.cargarDatos();
						Pelicula p = pelDese();
						gp.anadirPeli(p);
						if (gp.anadido(p)) {
							JOptionPane.showMessageDialog(new Frame(),
									"Pelicula anadida");
							this.dispose();
						}else{
							JOptionPane.showMessageDialog(new Frame(),
									"Pelicula _NO_ anadida");
						}
					} catch (excepAnadirDupli e1) {
						JOptionPane.showMessageDialog(new Frame(), e1.getDes());
					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					} catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				}
			}
		}
	}

	private Pelicula pelDese() throws ExcepDatosNoAdmitidos {

		Pelicula p = new Pelicula();
		p.setActorPrincipal(acto.getText());
		p.setDirector(dir.getText());
		p.setDuracion(putDura());

		p.setFechaEstreno(putFechaEstreno());
		p.setOscar(putOscar());
		p.setPais(pais.getText());
		p.setTitulo(titu.getText());

		return p;
	}

	private Integer putOscar() throws ExcepDatosNoAdmitidos {
		Integer dev = -1;
		Object a = spiOscar.getValue();
		dev = (Integer) a;
		if (dev <= -1) {// POR SI METE NEGATIVOS
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise el numero de oscars selecionado");
			throw e;
		}
		return dev;
	}
	@Deprecated
	private Date putFechaEstreno() {

		JFormattedTextField d = fecha.getTextField();
		String a = d.getText();
		java.util.Date newFecha = new java.util.Date(a);
		Date newFechaFin = new Date(newFecha.getYear(), newFecha.getMonth(),
				newFecha.getDay());

		return newFechaFin;

	}

	private int putDura() throws ExcepDatosNoAdmitidos {
		int dev = 0;
		Object a = spiDura.getValue();		
		double f=(double)a;
		dev = (int) f;
		if (dev <= 0) {// POR SI METE NEGATIVOS
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise la duracion de la serie selecionado");
			throw e;
		}
		return dev;
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = Button.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}
}